knitr::opts_chunk$set(echo = TRUE, warning= FALSE, message = FALSE, error=FALSE)
## Affichage de tableaux
library(knitr)
## Requêtes web
library(httr)
library(jsonlite)
## Tidyverse & co
library(dplyr, warn.conflicts = T, quietly = T)
library(ggplot2)API : Importation json
Le but de ce chapitre n’est pas d’apprendre en détail l’ensemble des possibilités qu’offrent les API pour des utilisateurs avancés, mais de fournir aux étudiants en data mining un certain nombre de solutions simples (mais efficaces) pour extraire des données de façon interactive et assurer leur mise à jour régulière.
On charge les packages utiles :
Choix d’une API
La première étape consiste à choisir l’API qui nous intéresse parmi plus de 600.
Le site public.opendatasoft
Nous allons centrer notre chapitre sur le site public.opendatasoft qui permet d’accèder à des centaines d’API à l’aide de requêtes normalisées. Sans apprendre en détail le fonctionnement de cette API, on va montrer comment créer de petites fonctions facilitant le travail d’exportation des variables ou des données.
On peut se rendre sur le site pour parcourir les API proposées en allant à l’adresse : https://public.opendatasoft.com
Catalogue des API
Plutôt que de pacourir le site web, on peut télécharger le catalogue général des bases de données du site public.opendatasoft … en se servant d’une requête API
x<-GET('https://public.opendatasoft.com/api/datasets/1.0/search/?q=&rows=1000&start=0')
y<-fromJSON(rawToChar((x$content)))
cat<-y$datasets$metas
row.names(cat)<-y$datasets$datasetid
kable(head(cat[,c(12,1,6,7,8)]),row.names = T)| license_url | domain | license | description | publisher | |
|---|---|---|---|---|---|
| analytical-house-prices-indicators | public | Custom License (see reference link) | OECD | ||
| sirene-v3-liens-de-successions-siret | https://www.etalab.gouv.fr/wp-content/uploads/2018/11/open-licence.pdf | public | Open License v2.0 | INSEE | |
| unix_domaine_professionnel_v324_utf8 | https://www.etalab.gouv.fr/wp-content/uploads/2014/05/Licence_Ouverte.pdf | public | Open License v1.0 | Pôle Emploi | |
| world-administrative-boundaries-countries | http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/ | public | Open Government Licence v3.0 | Based on dataset published by : World Food Programme (UN agency) | |
| georef-italy-ripartizione-geografica | https://creativecommons.org/licenses/by/3.0/ | public | CC BY 3.0 | Opendatasoft | |
| georef-italy-ripartizione-geografica-millesime | https://creativecommons.org/licenses/by/3.0/ | public | CC BY 3.0 | Opendatasoft |
On a donc récupéré un tableau qui comporte 605 lignes correspondant à 605 bases de données. Le nom des lignes du tableau indique le code de la base de données que l’on va utiliser ensuite dans les requêtes.
Choix d’un tableau de données
On suppose que le choix s’est porté sur la base de données dont le nom de code est prix-des-carburants-j-1
L’onglet information nous indique qu’il s’agit d’un site produit par le minstère de l’économie et des finances pour faciliter l’accès en temps réel au prix des carburants dans les stations services. Le but est d’informer les conosmmateurs des stations les moins chères à proximité de son domicile afin de stimuler la concurrence et faire baisser les prix.
Il est indiqué que la base se limite aux prix des douze derniers mois mais nous avons pu vérifier qu’on trouve en fait des données sur plus de trois ans.
Liste des variables
Avant de télécharger les données, on regarde précisément la liste des variables disponibles. On peut le faire sur le site web en parcourant les onglets. Mais il est également possible de lancer une requête pour connaître les variables du tableau que l’on va télécharger ainsi que les variables pouvant servir de “facettes” c’est-à-dire permettant d’effectuer des requêtes.
tab<-"prix-des-carburants-j-1"
url<-paste("https://public.opendatasoft.com/api/v2/catalog/datasets/",tab,"?",sep="")
x<-GET(url)
y<-fromJSON(rawToChar(x$content))
var<-y$dataset$fields
head(var) name description annotations.facet annotations.multivalued
1 id NA NA <NA>
2 cp NA TRUE <NA>
3 pop NA TRUE <NA>
4 address NA NA <NA>
5 com_arm_name NA TRUE <NA>
6 automate_24_24 NA TRUE <NA>
annotations.facetsort annotations.timeserie_precision annotations.unit
1 <NA> <NA> <NA>
2 <NA> <NA> <NA>
3 <NA> <NA> <NA>
4 <NA> <NA> <NA>
5 <NA> <NA> <NA>
6 <NA> <NA> <NA>
annotations.decimals
1 NA
2 NA
3 NA
4 NA
5 NA
6 NA
label type
1 Identifiant text
2 Code Postal text
3 Présence text
4 Adresse text
5 Nom Officiel Commune / Arrondissement Municipal Majuscule text
6 Automate 24-24 text
On extrait du tableau les colonnes qui fournissent le nom des variables, leur définition et leur type
var <- var %>% select(name, label, type)
kable(var)| name | label | type |
|---|---|---|
| id | Identifiant | text |
| cp | Code Postal | text |
| pop | Présence | text |
| address | Adresse | text |
| com_arm_name | Nom Officiel Commune / Arrondissement Municipal Majuscule | text |
| automate_24_24 | Automate 24-24 | text |
| timetable | Timetable | text |
| fuel | Carburant | text |
| shortage | Rupture | text |
| update | Mise à jour | datetime |
| price_gazole | Prix Gazole | double |
| price_sp95 | Prix SP95 | double |
| price_sp98 | Prix SP98 | double |
| price_gplc | Prix GPLc | double |
| price_e10 | Prix E10 | double |
| price_e85 | Prix E85 | double |
| services | Services | text |
| brand | Marque | text |
| name | Nom | text |
| geo_point | Geo Point | geo_point_2d |
| com_arm_code | Code officiel commune ou arrondissement | text |
| epci_code | Code Officiel EPCI | text |
| epci_name | Nom Officiel EPCI | text |
| dep_code | Code Officiel Département | text |
| dep_name | Nom Officiel Département | text |
| reg_code | Code Officiel Région | text |
| reg_name | Nom Officiel Région | text |
On peut transformer le programme que l’on vient d’executer en fonction pour un usage plus simple :
get_variables<-function(idtab = "prix-des-carburants-j-1") {
url<-paste("https://public.opendatasoft.com/api/v2/catalog/datasets/",idtab,"?",sep="")
x<-GET(url)
y<-fromJSON(rawToChar((x$content)))
var<-y$dataset$fields
var <- var %>% select(name, label, type)
return(var)
}On peut désormais appliquer notre fonction sur n’importe quel autre tableau du catalogue. Par exemple, si on choisit le tableau qualite_de-lair-france on obtient la liste de variables suivante :
var<-get_variables("qualite-de-lair-france")
kable(var)| name | label | type |
|---|---|---|
| country | Country Code | text |
| city | City | text |
| location | Location | text |
| coordinates | Coordinates | geo_point_2d |
| measurements_parameter | Pollutant | text |
| measurements_sourcename | Source Name | text |
| measurements_unit | Unit | text |
| measurements_value | Value | double |
| measurements_lastupdated | Last Updated | datetime |
| country_name_en | Country Label | text |
Récupération des données
Pour des utilisateurs non spécialiste, il est difficile de lancer une requête complexe qui suppose une maîtrise avancée des API et des protocoles de requête SOAP et REST. Nous allons opter ici pour une stratégie pragmatique (mais efficace) qui consiste à :
- Utiliser l’interface public.opendatasoft pour rédiger une requête
- Récupérer le lien de téléchargement
- Télécharger les données correspondant à la requête
- Effectuer les opérations de nettoyage des données et réaliser un graphique
- Modifier le lien et effectuer à nouveau le étapes 3 et 4
- Construire une fonction paramétrique de téléchargement + nettoyage + visualisation …
Pour illustrer cette stratégie, nous allons essayer de créer dans R une fonction automatisée qui télécharge le prix du carburant d’une commune et produit un graphique montrant son évolution au cours du temps dans les dfférentes stations. Nous allons ainsi essayer de reconstituer une application assez proche de celle du ministère de l’économie intitulée “essence pas cher”.
Nous ne chercherons toutefois pas à obtenir uniquement le dernier prix en date des stations mais plutôt à voir lesquelles sont les plus ou les mons chers sur une période de quelques années.
1. Rédaction d’une requête sur public opendatasoft
On utilise les filtres de l’interface pour sélectionner la commune cible à l’aide de son code postal (ex. 94370 = Sucy-en-Brie) et du type carburant (ex. Gazole) :
2. Récupération du lien de téléchargement
Une fois terminée la mise en place des filtres, on se déplace vers la fenêtre “Export” et on choisit le type de format de sortie que l’on souhaite obtenir. Nous pourrions obtenir des fichiers au format texte (.csv) ou tableur (.xls) mais nous allons adopter ici le format .json qui est plus universel dans le domaine de la data science et qui simplifie les transferts de données entre utilisateurs de différents langages de programmation tels que R ou Python.
Un click de souris sur le lien nous permet de récupérer l’URL de téléchargement :
Même si certains caractères spéciaux sont difficiles à comprendre comme %3A ou %22 on devine assez facilement la fonction des différents segments de la chaine de caractère qui constitue l’URL de requête :
- adresse du site web opendatasoft : https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/
- choix de la base de données : prix-des-carburants-j-1
- format d’export et langue : exports/json?lang=fr
- selection du carburant : &refine=fuel%3A%22Gazole%22
- selection de la commune par son code postal : &qv1=(94370)
- fuseau horaire (pour dater la requête) : &timezone=Europe%2FParis
3. Recupération des données à partir de l’URL
Nous pouvons maintenant rédiger un petit programme très simple qui va récupérer les données à partir de ce lien
link<-"https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(94370)&timezone=Europe%2FParis"
y<-fromJSON(link)
head(y) id cp pop address com_arm_name automate_24_24
1 94370007 94370 R 13 Rue Maurice Berteaux SUCY-EN-BRIE Non
2 94370008 94370 R 63/71 AV DU GENERAL LECLERC SUCY-EN-BRIE Oui
3 94370007 94370 R 13 Rue Maurice Berteaux SUCY-EN-BRIE Non
4 94370003 94370 R 1 Rue de Paris SUCY-EN-BRIE Oui
5 94370008 94370 R 63/71 AV DU GENERAL LECLERC SUCY-EN-BRIE Oui
6 94370003 94370 R 1 Rue de Paris SUCY-EN-BRIE Oui
timetable
1 {"Dimanche": {"fermeture": "22.00", "ouvert": 1, "ouverture": "07.00"}, "Jeudi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Lundi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mardi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mercredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Samedi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Vendredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}}
2 {"Dimanche": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Jeudi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Lundi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mardi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mercredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Samedi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Vendredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}}
3 {"Dimanche": {"fermeture": "22.00", "ouvert": 1, "ouverture": "07.00"}, "Jeudi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Lundi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mardi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mercredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Samedi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Vendredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}}
4 {"Dimanche": {"ouvert": 1}, "Jeudi": {"ouvert": 1}, "Lundi": {"ouvert": 1}, "Mardi": {"ouvert": 1}, "Mercredi": {"ouvert": 1}, "Samedi": {"ouvert": 1}, "Vendredi": {"ouvert": 1}}
5 {"Dimanche": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Jeudi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Lundi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mardi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mercredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Samedi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Vendredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}}
6 {"Dimanche": {"ouvert": 1}, "Jeudi": {"ouvert": 1}, "Lundi": {"ouvert": 1}, "Mardi": {"ouvert": 1}, "Mercredi": {"ouvert": 1}, "Samedi": {"ouvert": 1}, "Vendredi": {"ouvert": 1}}
fuel shortage update
1 Gazole, E10, SP98 SP95, E85, GPLc 2024-07-19T23:50:00+02:00
2 Gazole E85, SP95, GPLc, E10, SP98 2022-10-24T00:01:00+02:00
3 Gazole, E10, SP98 SP95, E85, SP95, GPLc 2022-11-08T00:01:00+01:00
4 Gazole, E10, SP98 SP95 2025-01-22T06:51:00+01:00
5 Gazole, E10, SP98 SP95, E85, GPLc 2022-12-06T00:01:00+01:00
6 Gazole, E10, SP98 SP95 2024-12-10T06:41:00+01:00
price_gazole price_sp95 price_sp98 price_gplc price_e10 price_e85
1 0.001778 NA 0.001988 NA 0.001878 NA
2 0.001818 NA NA NA NA NA
3 0.001847 NA 0.001679 NA 0.001569 NA
4 0.001784 NA 0.001928 NA 0.001818 NA
5 0.001833 NA 0.001759 NA 0.001649 NA
6 0.001668 NA 0.001822 NA 0.001730 NA
services
1 Boutique alimentaire, Boutique non alimentaire, Restauration à emporter, Vente de fioul domestique, Station de gonflage, Carburant additivé, Lavage automatique, Vente de gaz domestique (Butane, Propane), Wifi, Automate CB 24, 24
2 Boutique alimentaire, Boutique non alimentaire, Station de gonflage, Carburant additivé, Lavage automatique, Lavage manuel, Vente de gaz domestique (Butane, Propane), DAB (Distributeur automatique de billets)
3 Boutique alimentaire, Boutique non alimentaire, Restauration à emporter, Vente de fioul domestique, Station de gonflage, Carburant additivé, Lavage automatique, Vente de gaz domestique (Butane, Propane), Wifi, Automate CB 24, 24
4 NULL
5 Boutique alimentaire, Boutique non alimentaire, Station de gonflage, Carburant additivé, Lavage automatique, Lavage manuel, Vente de gaz domestique (Butane, Propane), DAB (Distributeur automatique de billets)
6 NULL
brand name geo_point.lon geo_point.lat com_arm_code
1 Total SARL DURMUS 2.51743 48.77333 94071
2 <NA> <NA> NA NA <NA>
3 Total SARL DURMUS 2.51743 48.77333 94071
4 Esso Express ESSO PETIT MARAIS 2.49956 48.77306 94071
5 <NA> <NA> NA NA <NA>
6 Esso Express ESSO PETIT MARAIS 2.49956 48.77306 94071
epci_code epci_name dep_code dep_name reg_code
1 200054781 Métropole du Grand Paris 94 Val-de-Marne 11
2 <NA> <NA> <NA> <NA> <NA>
3 200054781 Métropole du Grand Paris 94 Val-de-Marne 11
4 200054781 Métropole du Grand Paris 94 Val-de-Marne 11
5 <NA> <NA> <NA> <NA> <NA>
6 200054781 Métropole du Grand Paris 94 Val-de-Marne 11
reg_name
1 Île-de-France
2 <NA>
3 Île-de-France
4 Île-de-France
5 <NA>
6 Île-de-France
A la différence de la méthode GET vue au chapitre précédent, nous récupérons directement le fichier de données sans avoir besoin d’effectuer des transformations de type RawToChar. C’est donc beaucoup plus simple mais, en contrepartie, nous perdons toute une série d’informations qu’apportait la procédure dans les règles de l’art (date de téléchargement, messages d’erreur, version des données, etc.).
4. Nettoyage des données
Nous procédons ensuite à un petit nettoyage pour ne garder que les variables utiles :
names(y) [1] "id" "cp" "pop" "address"
[5] "com_arm_name" "automate_24_24" "timetable" "fuel"
[9] "shortage" "update" "price_gazole" "price_sp95"
[13] "price_sp98" "price_gplc" "price_e10" "price_e85"
[17] "services" "brand" "name" "geo_point"
[21] "com_arm_code" "epci_code" "epci_name" "dep_code"
[25] "dep_name" "reg_code" "reg_name"
don <- y %>% select(name,address, update, price = price_gazole ) %>%
mutate(update =as.Date(update)) %>%
arrange(update)Il y a toutefois une mauvaise surprise … les données semblent erronées à partir d’une certaine date
ggplot(don) +aes(x=update, y=price, col=address) + geom_point()En fait … les chiffres qui sont fournis après le 26 mars ont été divisés mystérieusement par 1000. Il faut donc corriger ce problème :
library(ggplot2)
don<-don %>% mutate(price_OK = case_when(price ==0 ~ NA,
price < 1 ~ price*1000,
TRUE ~ price))
ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()On note qu’il este une valeur aberrante mais sinon il est désormais possible de bien suivre l’évolution des prix au cours des trois dernières années et de repérer quelles est la station la moins chèr aux différentes dates.
5. Changement de lien
Essayons maintenant de reprendre l’ensemble de notre programme en changeant juste de commune dans le lien initial. On va ici soigner la rédaction du programme car nous comptons ensuite le transformer en fonction
On remplace le code postal de Sucy-en-Brie (94370) par celui d’Ivry-sur-Seine(94200).
# Choix du lien (changement du code postal)
link<-"https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(94200)&timezone=Europe%2FParis"
# Importation des données
y<-fromJSON(link)
# Selection des variables
don <- y %>% select(name,address, update, price = price_gazole ) %>%
mutate(update =as.Date(update)) %>%
arrange(update)
# Nettoyage des erreurs principales
don<-don %>% mutate(price_OK = case_when(price ==0 ~ NA,
price < 1 ~ price*1000,
TRUE ~ price))
# Réalisation d'un graphique
ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()6. Rédaction d’une Fonction
On peut maintenant écrire une fonction qui ne va dépendre que du code postal et va fournir en sortie le tableau de données. Tout ce que nous avons à faire est de modifier le lien en fonction du code postal qui sera le paramètre de la fonction.
Pour cela nous utilisons la commande R pasteO()qui permet de coller des chaînes de caractères sans ajouter d’expaces. Ici nous recollons le début de l’URL, le code de la commune que nous avons modifié et la fin de l’URL.
gazole_tab <- function(code="94370") {
# Choix du lien (changement du code postal)
link<-paste0("https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(", code,")&timezone=Europe%2FParis")
# Importation des données
y<-fromJSON(link)
# Selection des variables
tab <- y %>% select(name,address, update, price = price_gazole ) %>%
mutate(update =as.Date(update)) %>%
arrange(update)
# Nettoyage des erreurs principales
tab<-tab %>% mutate(price_OK = case_when(price ==0 ~ NA,
price < 1 ~ price*1000,
TRUE ~ price))
return(tab)
}Pour tester notre fonction gazole_tab(), on prend en exemple une nouvelle commune, par exemple Saint-Maur des Fossés (94100) :
res<-gazole_tab("94100")
head(res) name address update price price_OK
1 <NA> 57 BD DE CRETEIL 2021-02-18 1.499 1.499
2 Carrefour Market 57, Rue Delenue 2021-02-18 1.366 1.366
3 ESSO FOCH 99/101 Avenue Foch 2021-02-18 1.366 1.366
4 <NA> 29 bvd de créteil 2021-02-18 1.452 1.452
5 Carrefour Market 57, Rue Delenue 2021-02-19 1.371 1.371
6 ESSO FOCH 99/101 Avenue Foch 2021-02-19 1.371 1.371
Mais on pourrait aussi faire une fonction gazole_graph()qui renvoie non pas le tableau mais le graphique :
gazole_graph <- function(code="94370") {
# Choix du lien (changement du code postal)
link<-paste0("https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(", code,")&timezone=Europe%2FParis")
# Importation des données
y<-fromJSON(link)
# Selection des variables
don <- y %>% select(name,address, update, price = price_gazole ) %>%
mutate(update =as.Date(update)) %>%
arrange(update)
# Nettoyage des erreurs principales
don<-don %>% mutate(price_OK = case_when(price ==0 ~ NA,
price < 1 ~ price*1000,
TRUE ~ price))
# Réalisation d'un graphique
graph<-ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()
return(graph)
}On teste la fonction sur Saint-Maur des Fossés (94100) :
gazole_graph("94100")Mais le plus intéressant est de faire une fonction unique gazole()qui permet de renvoyer à la fois le tableau et le graphique en indiquant en sortie une liste d’objets comprenant à la fois le tableau (objet de type data.frame) et le graphique (objet de type ggplot2).
gazole <- function(code="94370") {
# Choix du lien (changement du code postal)
link<-paste0("https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(", code,")&timezone=Europe%2FParis")
# Importation des données
y<-fromJSON(link)
# Selection des variables
tab <- y %>% select(name,address, update, price = price_gazole ) %>%
mutate(update =as.Date(update)) %>%
arrange(update)
# Nettoyage des erreurs principales
tab<-tab %>% mutate(price_OK = case_when(price ==0 ~ NA,
price < 1 ~ price*1000,
TRUE ~ price))
# Réalisation d'un graphique
graph<-ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()
return(list("tab"=tab, "graph"=graph))
}Il suffit maintenant d’executer une seule fois la fonction (un seul appel de l’API) pour pouvoir ensuite au choix utiliser le tableau ou afficher le graphique.
res<-gazole("94100")
head(res$tab) name address update price price_OK
1 <NA> 57 BD DE CRETEIL 2021-02-18 1.499 1.499
2 Carrefour Market 57, Rue Delenue 2021-02-18 1.366 1.366
3 ESSO FOCH 99/101 Avenue Foch 2021-02-18 1.366 1.366
4 <NA> 29 bvd de créteil 2021-02-18 1.452 1.452
5 Carrefour Market 57, Rue Delenue 2021-02-19 1.371 1.371
6 ESSO FOCH 99/101 Avenue Foch 2021-02-19 1.371 1.371
res$graphConclusion
Ce chapitre a permis de combiner trois apprentissages fondamentaux du data mining qui seront repris ensuie à plusieurs reprises :
- Utiliser des API pour récupérer directement ses données sans effectuer de téléchargement “à la main”.
- Nettoyer les données reçues avant de les utiliser et automatiser autant que possible les procédures de nettoyages.
- Créer ses propres fonctions pour automatiser les tâches de récupération des données, nettoyage et production de tableaux ou graphiques.